/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package poproject.OptimizationTask;

import java.util.ArrayList;

/**
 * Reprezentuje przeszkodę na mapie, przez którą nie można poprowadzić drogi.
 * 
 * @author Eruanno
 */
public class MapObstacle {
    
    /**
     * Zbiór koordynat (tylko w pionie) zawierająca zabronione punkty
     */
    private ArrayList<Integer> restrictedCoordinates = new ArrayList<>();
    
    /**
     * Obiekt modelu całej mapy.
     */
    private MapModel mapModel;
    
    /**
     * Pozycja x-owa w której leży przeszkoda.
     */
    private int position;
    
    
    /**
     * Tworzy nowy obiekt przeszkody.
     * @param mapModel Mapa do której należy przeszkoda.
     * @param position Pozycja przeszkody
     */
    public MapObstacle(MapModel mapModel, int position)
    {
        this.mapModel = mapModel;
        
        if(position >= 0 && position < mapModel.numOfAreas())
            this.position = position; 
        else throw new IndexOutOfBoundsException("Pozycja przeszkody spoza zakresu.");
    }
    
    /**
     * Dodaje do listy nową współrzędną zabronioną.
     * Metoda ignoruje współrzędne już wcześniej wpisane. No i oczywiście
     * sprawdza czy współrzędna mieści się w przedziale (0, L)
     * 
     * @param coord wartość współrzędnej.
     */
    public void addRestricted(int coord){
        
        if(coord >= 0 && coord < mapModel.numOfLevels())
        {
            if(!restrictedCoordinates.contains(coord))
                restrictedCoordinates.add(coord);
        }
    }
    
    /**
     * Usuwa z listy zabronioną współrzędną
     * @param coord 
     */
    public void releaseRestricted(int coord){
        
        if(coord >= 0 && coord < mapModel.numOfLevels())
        {
            if(restrictedCoordinates.contains(coord))
                restrictedCoordinates.remove((Integer)coord);
        }
    }
    
    /**
     * Przełącza stan "zakazania" współrzędnej.
     * @param coord 
     */
    public void toggleRestricted(int coord){
        
        if(coord >= 0 && coord < mapModel.numOfLevels())
        {
            if(restrictedCoordinates.contains(coord))
                restrictedCoordinates.remove((Integer)coord);
            else
                restrictedCoordinates.add(coord);
        }
    }

    /**
     * @return Kopia listy z zabronionymi współrzędnymi.
     */
    public ArrayList<Integer> restrictedCoords() {
        return (ArrayList<Integer>)restrictedCoordinates.clone();
    }
    
    /**
     * Zwraca pozycję przeszkody.
     * @return 
     */
    public int position() {
        return this.position;
    }
}
